<?php

namespace utils\crypt;

use phpseclib3\Crypt\RSA;
use phpseclib3\Crypt\PublicKeyLoader;

class Crypt
{
    public static function getKey()
    {
        // 生成私钥
        $privateKey = RSA::createKey(2048); // 2048 位密钥

        // 获取私钥（PEM 格式）
        $privateKeyPem = $privateKey->toString('PKCS8');

        // 获取公钥（PEM 格式）
        $publicKey = $privateKey->getPublicKey();
        $publicKeyPem = $publicKey->toString('PKCS8');

        // 保存到文件（示例）
        $rootPath = app()->getRootPath();
        $storagePath = $rootPath .
            'extend' . DIRECTORY_SEPARATOR .
            'utils' . DIRECTORY_SEPARATOR .
            'crypt' . DIRECTORY_SEPARATOR .
            'zcerts' . DIRECTORY_SEPARATOR;
        $privateFile = $storagePath . 'private.pem';
        $publicFile = $storagePath . 'public.pem';

        file_put_contents($privateFile, $privateKeyPem);
        file_put_contents($publicFile, $publicKeyPem);
    }

    /**
     * 获得私钥
     * @return false|string
     */
    public static function getPrivateKey(): bool|string
    {
        $privateFile = app()->getRootPath() . env('CRYPT_PRIVATE');
        return file_get_contents($privateFile);
    }

    /**
     * 获得公钥
     * @return false|string
     */
    public static function getPublicKey()
    {
        $publicFile = app()->getRootPath() . env('CRYPT_PUBLIC');
        return file_get_contents($publicFile);
    }

    /**
     * 加密
     * @param $plaintext
     * @return string
     */
    public static function encrypt($plaintext)
    {
        // 加载公钥
        $public_key = self::getPublicKey();
        $publicKey = PublicKeyLoader::load($public_key);

        // 设置加密模式（与前端 JSEncrypt 默认一致）
        $publicKey = $publicKey->withPadding(RSA::ENCRYPTION_PKCS1);

        // 加密数据（返回 Base64 字符串）
        $ciphertext = $publicKey->encrypt($plaintext);
        $encryptedBase64 = base64_encode($ciphertext);

        // 发送给前端或存储
        return $encryptedBase64;
    }

    /**
     * 解密
     * @param $encryptedBase64
     * @return mixed
     */
    public static function decrypt($encryptedBase64)
    {
        // 加载私钥
        $private_key = self::getPrivateKey();
        $privateKey = PublicKeyLoader::load($private_key);

        // 设置解密模式
        $privateKey = $privateKey->withPadding(RSA::ENCRYPTION_PKCS1);

        // 解密数据（需先 Base64 解码）
        // $encryptedBase64 = '前端传来的加密字符串';
        $ciphertext = base64_decode($encryptedBase64);
        $plaintext = $privateKey->decrypt($ciphertext);

        // 输出解密后的原始数据
        return $plaintext;
    }
}